import axios from 'axios'
import { message } from 'ant-design-vue'

// 创建axios实例
const api = axios.create({
  baseURL: '/api', // API基础路径
  timeout: 10000, // 请求超时时间
})

// 是否正在刷新token的标志
let isRefreshing = false
// 失败请求队列
let failedQueue = []

const processQueue = (error, token = null) => {
  failedQueue.forEach(prom => {
    if (error) {
      prom.reject(error)
    } else {
      prom.resolve(token)
    }
  })
  
  failedQueue = []
}

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    // 从localStorage中获取access token
    const accessToken = localStorage.getItem('access_token')
    if (accessToken) {
      // 在请求头中添加access token
      config.headers['Authorization'] = `Bearer ${accessToken}`
    }
    return config
  },
  (error) => {
    // 请求错误处理
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    // 对响应数据进行处理
    return response
  },
  async (error) => {
    const originalRequest = error.config
    
    // 响应错误处理
    if (error.response) {
      // token过期
      if (error.response.status === 401 && !originalRequest._retry) {
        if (isRefreshing) {
          // 如果正在刷新token，则将请求加入队列
          return new Promise(function(resolve, reject) {
            failedQueue.push({ resolve, reject })
          }).then(token => {
            originalRequest.headers['Authorization'] = 'Bearer ' + token
            return api.request(originalRequest)
          }).catch(err => {
            return Promise.reject(err)
          })
        }
        
        originalRequest._retry = true
        isRefreshing = true
        
        const refreshToken = localStorage.getItem('refresh_token')
        if (refreshToken) {
          try {
            // 尝试刷新token
            const response = await axios.post('/api/auth/refresh', {
              refresh_token: refreshToken
            })
            
            if (response.data.code === 200) {
              const { access_token } = response.data.data
              localStorage.setItem('access_token', access_token)
              api.defaults.headers.common['Authorization'] = 'Bearer ' + access_token
              processQueue(null, access_token)
              return api(originalRequest)
            } else {
              processQueue(new Error('刷新token失败'), null)
              localStorage.removeItem('access_token')
              localStorage.removeItem('refresh_token')
              message.error('登录已过期，请重新登录')
              return Promise.reject(error)
            }
          } catch (err) {
            processQueue(err, null)
            localStorage.removeItem('access_token')
            localStorage.removeItem('refresh_token')
            message.error('登录已过期，请重新登录')
            return Promise.reject(err)
          } finally {
            isRefreshing = false
          }
        } else {
          // 没有refresh token，需要重新登录
          localStorage.removeItem('access_token')
          localStorage.removeItem('refresh_token')
          message.error('登录已过期，请重新登录')
        }
      }
      
      // 其他状态码处理
      switch (error.response.status) {
        case 403:
          // 拒绝访问
          message.error('拒绝访问')
          console.error('拒绝访问')
          break
        case 500:
          // 服务器错误
          message.error('服务器错误')
          console.error('服务器错误')
          break
        default:
          message.error(`请求错误: ${error.response.status}`)
          console.error(`错误:${error.response.status}`)
      }
    } else if (error.request) {
      // 网络错误
      message.error('网络错误，请检查网络连接')
      console.error('网络错误')
    } else {
      // 其他错误
      message.error('请求失败')
      console.error('错误:', error.message)
    }
    return Promise.reject(error)
  }
)

export default api